#include <jni.h>
#include <string>
#include <unistd.h>
#include "com_example_imitationqqsound_qqsound_ChatActivity.h"
using namespace FMOD;
// 日志输出
#include "android/log.h"
#define TAG "native-lib.cpp"
// __VA_ARGS__ 代表 ...的可变参数
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_imitationqqsound_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}extern "C"
JNIEXPORT void JNICALL
Java_com_example_imitationqqsound_qqsound_ChatActivity_voiceChangeNative(JNIEnv *env, jobject thiz,jint mode_normal,jstring path) {
    // TODO: implement voiceChangeNative()
    char *content_ = "默认 播放完毕";

    const char *path_ = env->GetStringUTFChars(path, NULL);

    //音频引擎系统 指针
    System *system = 0;

    //声音 指针
    Sound *sound = 0;

    //通道，音轨，声道 指针
    Channel *channel = 0;

    //DSP  数字信号处理  指针
    DSP *dsp = 0;

    system->close();

    // TODO 第一步 创建系统
    System_Create(&system);

    //TODO 第二步 系统的初始化  参数1： 最大音轨数， 参数2 系统初始化标记  ，参数3： 额外数据
    system->init(32, FMOD_INIT_NORMAL, 0);

    //TODO 第三步 创建声音  参数1： 路径， 参数2 声音初始化标记  ，参数3： 额外数据 参数4：声音指针
    system->createSound(path_, FMOD_DEFAULT, 0, &sound);

    //TODO 第四步 创建声音  参数1： 声音， 参数2 分组音轨  ，参数3： 控制 参数4：通道
    system->playSound(sound, 0, false, &channel);

    // TODO 第五步 增加特效
    switch (mode_normal) {
        case com_example_imitationqqsound_qqsound_ChatActivity_MODE_NORMAL://原声
            content_ = "原声播放完毕";
            break;

        case com_example_imitationqqsound_qqsound_ChatActivity_MODE_LUOLI://萝莉
            content_ = "萝莉播放完毕";
            //音调高  2.0
            //1.创建DSP 类型的Pitch 音频条件
            system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp);
            //2.设置Pitch音频节 2.0
            dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,2.0f);
            //3.添加音效进去 音轨
            channel->addDSP(0,dsp);

            break;

        case com_example_imitationqqsound_qqsound_ChatActivity_MODE_DASHU://大叔
            content_ = "大叔播放完毕";
            //音调高  0.7
            //1.创建DSP 类型的Pitch 音频条件
            system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp);
            //2.设置Pitch音频节 2.0
            dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,0.7f);
            //3.添加音效进去 音轨
            channel->addDSP(0,dsp);
            break;

        case com_example_imitationqqsound_qqsound_ChatActivity_MODE_GAOGUAI://搞怪
            content_ = "搞怪播放完毕";
            //声音频率快
            //从音轨拿到当前频率
            float  mFrequency;
            channel->getFrequency(&mFrequency);
            //修改频率
            channel->setFrequency(mFrequency*1.5f);
            break;

        case com_example_imitationqqsound_qqsound_ChatActivity_MODE_JINGSONG://惊悚
            content_ = "惊悚播放完毕";
            //特点：很多声音的拼接

            //TODO 音调低
            //1.创建DSP 类型的Pitch 音频条件
            system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp);
            //2.设置Pitch音频节 2.0
            dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,0.7f);
            //3.添加音效进去 音轨
            channel->addDSP(0,dsp);
            //TODO 搞点回声
            system->createDSPByType(FMOD_DSP_TYPE_ECHO,&dsp );
            dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY,200);//回音 延时 10  to5000， Default = 500.
            dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK,20);//回音衰减度  0 to 100.  Default = 50.0.
            channel->addDSP(1,dsp);
            //TODO 颤抖
            system->createDSPByType(FMOD_DSP_TYPE_TREMOLO,&dsp );
            dsp->setParameterFloat(FMOD_DSP_TREMOLO_FREQUENCY,20);//颤抖 0.1 to 20.  Default = 5.
            dsp->setParameterFloat(FMOD_DSP_TREMOLO_SKEW,0.8f);//
            channel->addDSP(2,dsp);
            break;

        case com_example_imitationqqsound_qqsound_ChatActivity_MODE_KONGLING://空灵
            content_ = "空灵播放完毕";
            //回音
            system->createDSPByType(FMOD_DSP_TYPE_ECHO,&dsp );
            dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY,200);//回音 延时 10  to5000， Default = 500.
            dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK,20);//回音衰减度  0 to 100.  Default = 50.0.
            channel->addDSP(0,dsp);
            break;
    }

    //等待播放完毕 再回收
    bool isPlayer = true;
    while (isPlayer) {
        //如果播放完毕，音轨知道，内部会修改isPlayer = false
        channel->isPlaying(&isPlayer);
        usleep(1000 * 1000);
    }

//    jclass mainClass = env->GetObjectClass(thiz);
//    jmethodID playEnd = env->GetMethodID(mainClass,"playEnd", "(Ljava/lang/String;)V");
//    jstring js_content = env->NewStringUTF(content_);
//    env->CallVoidMethod(thiz,playEnd,js_content);
//    env->ReleaseStringUTFChars(js_content,content_);


    sound->release();
    system->close();
    system->release();
    env->ReleaseStringUTFChars(path, path_);
}extern "C"
JNIEXPORT void JNICALL
Java_com_example_imitationqqsound_qqsound_ChatActivity_playInterrupt(JNIEnv *env, jobject thiz) {
    // TODO: implement playInterrupt()

}